﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LH.Entidad;
using System.Data;
using LH.DataAccess;
using System.Configuration;
using log4net;

namespace LH.Datos
{

    public class EtiquetaDA
    {
        #region --- Variables y Constantes ---
        private static readonly ILog log = LogManager.GetLogger(typeof(EtiquetaDA));

        // Nombre procedimiento almacenado
        private const string PROCEDIMIENTO_RFID_PROCESARBIEN = "USP_RFID.IRTP_ProcesarLecturaBien";
        private const string PROCEDIMIENTO_RFID_BUSCARBIENBARRA = "USP_RFID.IRTP_BuscarBienCODBARRA";

        private const string PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID1 = "USP_RFID_LECTOR.RFID_GuardarRegistroIRTPRFID1";
        private const string PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID2 = "USP_RFID_LECTOR.RFID_GuardarRegistroIRTPRFID2";
        private const string PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID3 = "USP_RFID_LECTOR.RFID_GuardarRegistroIRTPRFID3";
        private const string PROCEDIMIENTO_RFID_ValidarRegistroIRTPRFID1 = "USP_RFID_LECTOR.RFID_ValidarRegistroIRTPRFID1";
        private const string PROCEDIMIENTO_RFID_ValidarRegistroIRTPRFID2 = "USP_RFID_LECTOR.RFID_ValidarRegistroIRTPRFID2";
        private const string PROCEDIMIENTO_RFID_ValidarRegistroIRTPRFID3 = "USP_RFID_LECTOR.RFID_ValidarRegistroIRTPRFID3";
        private const string PROCEDIMIENTO_RFID_EliminarRegistroIRTPRFID1 = "USP_RFID_LECTOR.RFID_EliminarRegistroIRTPRFID1";
        private const string PROCEDIMIENTO_RFID_EliminarRegistroIRTPRFID2 = "USP_RFID_LECTOR.RFID_EliminarRegistroIRTPRFID2";
        private const string PROCEDIMIENTO_RFID_EliminarRegistroIRTPRFID3 = "USP_RFID_LECTOR.RFID_EliminarRegistroIRTPRFID3";
        private const string PROCEDIMIENTO_RFID_ListarRegistroIRTPRFID = "USP_RFID_LECTOR.RFID_ListarRegistroIRTPRFID";

        // Parametros Entrada

        private const string PARAM_IIDUSUARIO = "P_IIDUSUARIO";
        private const string PARAM_IIDSOLICITUD = "P_IIDSOLICITUD";
        private const string PARAM_IIDMOVIMIENTO_TIPO = "P_IIDMOVIMIENTOTIPO";
        private const string PARAM_IIDESTADO = "P_IIDESTADO";
        private const string PARAM_IIDSITUACION = "P_IIDSITUACION";

        private const string PARAM_EPC = "P_EPC";
        private const string PARAM_READER = "P_READER";
        private const string PARAM_ANTENA = "P_ANTENA";
        private const string PARAM_PCBITS = "P_PCBITS";
        private const string PARAM_PEAKRSSIINDBM = "P_PEAKRSSIINDBM";
        private const string PARAM_PHASEANGLE = "P_PHASEANGLE";
        private const string PARAM_TAGSEENCOUNT = "P_TAGSEENCOUNT";

        private const string PARAM_FECHA = "P_FECHA";

        private const string PARAM_CURSOR = "P_LISTAETIQUETAS";
        private const string PARAM_CURSOR_2 = "P_LISTABIENES";

        // Parametros Salida

        private const string IIDSOLICITUD = "IIDSOLICITUD";
        private const string IIDMOVIMIENTO_TIPO = "IIDMOVIMIENTOTIPO";
        private const string IIDESTADO = "IIDESTADO";
        private const string IIDSITUACION = "IIDSITUACION";
        private const string IIDUSUARIO = "IIDUSUARIO";
        private const string VCODBARRA = "VCODBARRA";

        #endregion

        #region --- Metodos Propios ---

        public Boolean guardarRegistroIRTPRFID1(Etiqueta etiqueta)
        {


            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.iniciarTransaccion();

                db.NombreProcedimiento = PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID1;
                db.agregarParametro(PARAM_EPC, DbType.String, ParameterDirection.Input, etiqueta.epc);
                db.agregarParametro(PARAM_READER, DbType.String, ParameterDirection.Input, etiqueta.reader);
                db.agregarParametro(PARAM_ANTENA, DbType.String, ParameterDirection.Input, etiqueta.antena);
                db.agregarParametro(PARAM_PCBITS, DbType.Int16, ParameterDirection.Input, etiqueta.pcBits);
                db.agregarParametro(PARAM_PEAKRSSIINDBM, DbType.Double, ParameterDirection.Input, etiqueta.peakRSSIInDbm);
                db.agregarParametro(PARAM_PHASEANGLE, DbType.Double, ParameterDirection.Input, etiqueta.phaseAngleInRadians);
                db.agregarParametro(PARAM_TAGSEENCOUNT, DbType.Int16, ParameterDirection.Input, etiqueta.tagSeenCount);

                db.ejecutar();

                db.confirmarTransaccion();
            }



            if (log.IsDebugEnabled)
            {
                log.Debug("PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID1");
            }

            return true;
        }

        public Boolean guardarRegistroIRTPRFID2(Etiqueta etiqueta)
        {

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.iniciarTransaccion();

                db.NombreProcedimiento = PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID2;
                db.agregarParametro(PARAM_EPC, DbType.String, ParameterDirection.Input, etiqueta.epc);
                db.agregarParametro(PARAM_READER, DbType.String, ParameterDirection.Input, etiqueta.reader);
                db.agregarParametro(PARAM_ANTENA, DbType.String, ParameterDirection.Input, etiqueta.antena);
                db.agregarParametro(PARAM_PCBITS, DbType.Int16, ParameterDirection.Input, etiqueta.pcBits);
                db.agregarParametro(PARAM_PEAKRSSIINDBM, DbType.Double, ParameterDirection.Input, etiqueta.peakRSSIInDbm);
                db.agregarParametro(PARAM_PHASEANGLE, DbType.Double, ParameterDirection.Input, etiqueta.phaseAngleInRadians);
                db.agregarParametro(PARAM_TAGSEENCOUNT, DbType.Int16, ParameterDirection.Input, etiqueta.tagSeenCount);

                db.ejecutar();

                db.confirmarTransaccion();
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID2");
            }

            return true;
        }

        public Boolean guardarRegistroIRTPRFID3(Etiqueta etiqueta)
        {

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.iniciarTransaccion();

                db.NombreProcedimiento = PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID3;
                db.agregarParametro(PARAM_EPC, DbType.String, ParameterDirection.Input, etiqueta.epc);
                db.agregarParametro(PARAM_READER, DbType.String, ParameterDirection.Input, etiqueta.reader);
                db.agregarParametro(PARAM_ANTENA, DbType.String, ParameterDirection.Input, etiqueta.antena);
                db.agregarParametro(PARAM_PCBITS, DbType.Int16, ParameterDirection.Input, etiqueta.pcBits);
                db.agregarParametro(PARAM_PEAKRSSIINDBM, DbType.Double, ParameterDirection.Input, etiqueta.peakRSSIInDbm);
                db.agregarParametro(PARAM_PHASEANGLE, DbType.Double, ParameterDirection.Input, etiqueta.phaseAngleInRadians);
                db.agregarParametro(PARAM_TAGSEENCOUNT, DbType.Int16, ParameterDirection.Input, etiqueta.tagSeenCount);

                db.ejecutar();

                db.confirmarTransaccion();

            }

            if (log.IsDebugEnabled)
            {
                log.Debug("PROCEDIMIENTO_RFID_GuardarRegistroIRTPRFID3");
            }

            return true;
        }

        public Boolean validarRegistroIRTPRFID1(Etiqueta etiqueta)
        {
            DataSet dsValidarRegistro = new DataSet();

            Boolean etiquetaResultado = false;

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_ValidarRegistroIRTPRFID1;
                db.agregarParametro(PARAM_EPC, DbType.String, ParameterDirection.Input, etiqueta.epc);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsValidarRegistro);

                if (dsValidarRegistro.Tables.Count > 0)
                {
                    foreach (DataRow fila in dsValidarRegistro.Tables[0].Rows)
                    {
                        Etiqueta etiqueta_prueba = new Etiqueta();
                        etiqueta_prueba.epc = fila["EPC"].ToString();
                        etiquetaResultado = true;
                    }
                }
            }

            return etiquetaResultado;
        }

        public Boolean validarRegistroIRTPRFID2(Etiqueta etiqueta)
        {
            DataSet dsValidarRegistro = new DataSet();

            Boolean etiquetaResultado = false;

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_ValidarRegistroIRTPRFID2;
                db.agregarParametro(PARAM_EPC, DbType.String, ParameterDirection.Input, etiqueta.epc);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsValidarRegistro);

                if (dsValidarRegistro.Tables.Count > 0)
                {
                    foreach (DataRow fila in dsValidarRegistro.Tables[0].Rows)
                    {
                        Etiqueta etiqueta_prueba = new Etiqueta();
                        etiqueta_prueba.epc = fila["EPC"].ToString();
                        etiquetaResultado = true;
                    }
                }
            }

            return etiquetaResultado;
        }

        public Boolean validarRegistroIRTPRFID3(Etiqueta etiqueta)
        {
            DataSet dsValidarRegistro = new DataSet();

            Boolean etiquetaResultado = false;

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_ValidarRegistroIRTPRFID3;
                db.agregarParametro(PARAM_EPC, DbType.String, ParameterDirection.Input, etiqueta.epc);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsValidarRegistro);

                if (dsValidarRegistro.Tables.Count > 0)
                {
                    foreach (DataRow fila in dsValidarRegistro.Tables[0].Rows)
                    {
                        Etiqueta etiqueta_prueba = new Etiqueta();
                        etiqueta_prueba.epc = fila["EPC"].ToString();
                        etiquetaResultado = true;
                    }
                }
            }

            return etiquetaResultado;
        }

        public Boolean eliminarRegistroIRTPRFID1(DateTime Hora)
        {

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.iniciarTransaccion();

                db.NombreProcedimiento = PROCEDIMIENTO_RFID_EliminarRegistroIRTPRFID1;
                db.agregarParametro(PARAM_FECHA, DbType.String, ParameterDirection.Input, Hora.ToString("dd/MM/yyyy HH:mm:ss"));

                db.ejecutar();

                db.confirmarTransaccion();
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("eliminarRegistroIRTPRFID1");
            }

            return true;
        }

        public Boolean eliminarRegistroIRTPRFID2(DateTime Hora)
        {

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {

                db.iniciarTransaccion();
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_EliminarRegistroIRTPRFID2;
                db.agregarParametro(PARAM_FECHA, DbType.String, ParameterDirection.Input, Hora.ToString("dd/MM/yyyy HH:mm:ss"));

                db.ejecutar();

                db.confirmarTransaccion();
            }

            if (log.IsDebugEnabled)
            {
                log.Debug("eliminarRegistroIRTPRFID2");
            }

            return true;
        }

        public Boolean eliminarRegistroIRTPRFID3(DateTime Hora)
        {

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.iniciarTransaccion();

                db.NombreProcedimiento = PROCEDIMIENTO_RFID_EliminarRegistroIRTPRFID3;
                db.agregarParametro(PARAM_FECHA, DbType.String, ParameterDirection.Input, Hora.ToString("dd/MM/yyyy HH:mm:ss"));

                db.ejecutar();

                db.confirmarTransaccion();

            }

            if (log.IsDebugEnabled)
            {
                log.Debug("eliminarRegistroIRTPRFID3");
            }

            return true;
        }

        public ListaEtiqueta ConsultaRegistrosValidarEstado()
        {
            DataSet dsValidarRegistro = new DataSet();

            ListaEtiqueta listaEtiqueta = new ListaEtiqueta();

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_ListarRegistroIRTPRFID;
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsValidarRegistro);

                if (dsValidarRegistro.Tables.Count > 0)
                {
                    foreach (DataRow fila in dsValidarRegistro.Tables[0].Rows)
                    {
                        Etiqueta etiqueta = new Etiqueta();
                        etiqueta.epc = fila["EPC"].ToString();

                        listaEtiqueta.Add(etiqueta);
                    }
                }
            }

            return listaEtiqueta;
        }

        public EtiquetaBien procesarMovimientoBien(Etiqueta etiqueta)
        {
            DataSet dsRevisarMovimientoBien = new DataSet();

            EtiquetaBien etiquetabien = null;

            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {

                db.NombreProcedimiento = PROCEDIMIENTO_RFID_PROCESARBIEN;
                db.agregarParametro(PARAM_EPC, DbType.String, ParameterDirection.Input, etiqueta.epc);
                db.agregarParametro(PARAM_IIDUSUARIO, DbType.Int32, ParameterDirection.Input, Convert.ToInt32(ConfigurationManager.AppSettings[IIDUSUARIO]));
                db.agregarParametro(PARAM_CURSOR_2, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsRevisarMovimientoBien);

                if (dsRevisarMovimientoBien.Tables.Count > 0)
                {
                    etiquetabien = generarEtiquetabien(dsRevisarMovimientoBien.Tables[0].Rows[0]);
                }
            }

            return etiquetabien;
        }

        private EtiquetaBien generarEtiquetabien(DataRow fila)
        {

            EtiquetaBien etiquetabien = new EtiquetaBien();
            etiquetabien.epc = fila["EPC"].ToString();
            etiquetabien.idEstadoPrestamo = Convert.ToInt32(fila["IDESTADOPRESTAMO"]);
            etiquetabien.iIdBien = Convert.ToInt32(fila["IIDBIEN"]);
            etiquetabien.vCodBarra = fila["VCODBARRA"].ToString();
            etiquetabien.vBIncidencia = fila["BINCIDENCIA"].ToString();
            etiquetabien.vBCambio = fila["BCAMBIO"].ToString();

            return etiquetabien;
        }


        public String obtenerCodbarra(Etiqueta etiqueta)
        {
            String vcodbarra = null;

            DataSet dsEtiqueta = new DataSet();



            using (Database db = new Database(ConstantesDAO.NombreInterface.ConexIRTP))
            {
                db.NombreProcedimiento = PROCEDIMIENTO_RFID_BUSCARBIENBARRA;
                db.agregarParametro(PARAM_EPC, DbType.String, ParameterDirection.Input, etiqueta.epc);
                db.agregarParametro(PARAM_CURSOR, DbType.Binary, ParameterDirection.Output, null);

                IDataAdapter dataAdapter = db.obtenerDataAdapter();
                dataAdapter.Fill(dsEtiqueta);

                if (dsEtiqueta.Tables.Count > 0)
                {
                    vcodbarra = generarVcodbarra(dsEtiqueta.Tables[0].Rows[0]);

                }
            }

            return vcodbarra;
        }

        private String generarVcodbarra(DataRow fila)
        {
            String retorno = fila[VCODBARRA].ToString();

            return retorno;
        }

        #endregion
    }
}